/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package clientegestionred;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.smi.*;
import org.snmp4j.transport.DefaultUdpTransportMapping;
/**
 *
 * @author manolo
 */
public class nuevoInterfaz {

    private String address; //direccion del agente SNMP.
    private static Snmp snmp; //objeto para la comunicacion SNMP con el agente.

    private static final OID [] ifNumber = new OID []{new OID("1.3.6.1.2.1.2.1.0")};
    private static final OID [] sysUpTime = new OID[]{new OID("1.3.6.1.2.1.1.3.0")};
    private static final OID [] ifLastChange = new OID[]{new OID("1.3.6.1.2.1.2.2.1.9")};
    
    
    private Variable [] response=new Variable []{}; //objeto que almacena las respuestas de consulta.

    /* Constructor */
    public nuevoInterfaz(String address) {
        super();
        this.address = address;
    }

    //main() que hay que eliminar cuando se integre con la clase principal
    //ahora solo vale para hacer las pruebas mas rapido, sin tener que llamar
    //a GestorDeREd
    public static void main(String args[]) throws IOException{
        nuevoInterfaz prueba = new nuevoInterfaz("udp:127.0.0.1/161");
        prueba.start();
    }
    //Funcion start que inicializa y llama al resto de las funciones
    ////////////////////////////////////////////
    private void start() throws IOException {
        TransportMapping transport = new DefaultUdpTransportMapping();
        snmp = new Snmp(transport);
        transport.listen();
        System.out.println("A continuacion se muestran los interfaces");
        System.out.flush();
        Consulta consulta = new Consulta(snmp,address);
            /*Mostrar interfaces del equipo*/
        int interf = selectInterfaz(consulta);
        System.out.println("Nombre \tTipo \t\tMTU \tMAC \t\tBytes que envió el interfaz");
        System.out.println("*************************************************"+
                "*******************************************");
        System.out.println("*************************************************"+
                "*******************************************" );
        OID[] oids = new OID[]{new OID("1.3.6.1.2.1.2.2.1.2."+interf),
        new OID("1.3.6.1.2.1.2.2.1.3."+interf),
        new OID("1.3.6.1.2.1.2.2.1.4."+interf),
        new OID("1.3.6.1.2.1.2.2.1.6."+interf),
        new OID("1.3.6.1.2.1.2.2.1.16."+interf)};
        response=consulta.get(oids);
        String tipo = response[1].toString();
        String bytes = response[4].toString();
        System.out.println(response[0].toString()+"\t"+traduceTipo(tipo)+"\t"+
        response[2].toString()+"\t"+response[3].toString()+"\t"+miraByte(bytes)+"\n"
                + "\n");
        System.out.flush();
        errorInterfaz(interf, consulta);

    }
    //Pide el numero que equivale al interfaz que se desea la informacion
    ////////////////////////////////////////////////////////////
    public int selectInterfaz(Consulta consulta) throws IOException{

            response=consulta.get(ifNumber);
            int totalInterfaces = response[0].toInt();
            OID [] ifDescr;
            for(int i=1;i<=totalInterfaces;i++)
            {
                ifDescr= new OID []{new OID("1.3.6.1.2.1.2.2.1.2."+i)};
                response=consulta.get(ifDescr);
                System.out.println(i+"-"+response[0].toString());
            }
            System.out.println("Elija la interfaz de la que desee ver la" +
                    " informacion");
            BufferedReader bReader = new BufferedReader(new InputStreamReader
                    (System.in));
            String bReaderString= bReader.readLine();
            int interf=Integer.parseInt(bReaderString.trim());
            return interf;

    }
    //Mostrar el tipo en funcion del numero que retorne
    /////////////////////////////////////////
    public String traduceTipo(String tipo){
        int n = Integer.parseInt(tipo);
        String resultado;
        switch(n){
            case 6: 
                resultado = "ethernet-csmacd";
                return resultado;

                case 18:
                resultado = "dsl";
                return resultado;

                case 23:
                resultado = "ppp";
                return resultado;

                case 20:
                resultado = "BasicISDN";
                return resultado;

            case 24: 
                resultado = "softwareLoopback";
                return resultado;
            default:
                resultado ="Sin tipo especificado";
                return resultado;    

    }
    } //traduceTipo

    //Muestra los bytes en la unidad correcta
    //////////////////////////////////////////
    public String miraByte(String bytes){
            int n = Integer.parseInt(bytes);            
            if(n < 1024)
            {
                String resultado = n+ " bytes";
                return resultado;
            }
            else{
                    if(n< 1048576)
                    {
                        double h= (double)n/1024;
                        String resultado = h+ " Kbytes";
                        return resultado;
                    }
                        double h = (double)n/1048576;
                        String resultado = h+ " Mbytes";
                        return resultado;
            }

    }//miraByte


    //Mostrar los errores de los interfaces
    /////////////////////////////////////////
    public void errorInterfaz(int interf, Consulta consulta) throws IOException
    {
        System.out.println("Errores que se produjeron en el Interfaz");
        System.out.println("*************************************************"+
                "*******************************************");
        
        OID[] oids = new OID[]{new OID("1.3.6.1.2.1.2.2.1.13."+interf),    //descartados a la entrada
        new OID("1.3.6.1.2.1.2.2.1.14."+interf),  //paquetes con errores
        new OID("1.3.6.1.2.1.2.2.1.15."+interf),  //paquetes descartados por desconocer el protocolo
        new OID("1.3.6.1.2.1.2.2.1.19."+interf),   //descartados a la salida
        new OID("1.3.6.1.2.1.2.2.1.20."+interf)};  //con errores a la salida
        response=consulta.get(oids);
        System.out.println("\n\tPaquetes descartados (IN): "+response[0]);
        System.out.println("\n\tPaquetes erroneos (IN): "+response[1]);
        System.out.println("\n\tPaquetes descartados por desconocer el protocolo (IN): "
                +response[2]+"\n");
        System.out.println("*************************************************"+
                "*******************************************" );
        System.out.println("\n\tPaquetes descartados (OUT): "+response[3]);
        System.out.println("\n\tPaquetes con errores (OUT): "+response[4]);
    }
}

